package gameobjects;

import java.util.ArrayList;

import javagame.Level;

import org.newdawn.slick.Animation;
import org.newdawn.slick.Color;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;

public class Boss2 extends Protivnik{
	
	private static int startHP = 100;
	private static int startHP2 = 50;
	private static int startHP3 = 50;
	
	private Image HP_bar1;//bar za prikazivanje preostale snage prve elise
	private Image HP_bar2;//bar za prikazivanje preostale snage druge elise
	private Image HP_bar3;//bar za prikazivanje preostale snage trece elise
	private int HP2;//snaga druge elise
	private int HP3;//snaga trece elise
	private int metakSredina;//za odbrojavanje metaka za one topove sto pucaju iskosa
	private Animation blink;//animacija kada se pogodi bos
	private int brBlink1;//koliko dugo da blinka glavna elisa
	private int brBlink2;//koliko dugo da blinka leva elisa
	private int brBlink3;//koliko dugo da blinka desna elisa
	private Animation elisa;//animacija elise
	private Animation eksplozija2;
	private Animation eksplozija3;
	private Animation rupa;
	private int metakOdbrojavanje2;
	private boolean pucaNaPrvog;
	private boolean blink1;
	private boolean blink2;
	private boolean blink3;
	private ArrayList<Metak> rakete;
	
	public Boss2(Igrac igrac, Igrac2 igrac2, Level nivo) {
		super(igrac, igrac2, nivo);
		rakete = new ArrayList<Metak>();
		setHP(startHP);//glavna elisa
		HP2 = startHP2;
		HP3 = startHP3;
		setVrsta(tip_protivnika.BOSS);
		metakSredina = 1;
		brBlink1 = 5;
		brBlink2 = 5;
		brBlink3 = 5;
		blink1 = false;
		blink2 = false;
		blink3 = false;
		setMetakOdbrojavanje(20);
		metakOdbrojavanje2 = 20;
		setSizeX(500);
		setSizeY(300);
		pucaNaPrvog = false;
		setTenkPomeraj(25);
		setProtivnikPomerajX(25);
		setBrojTopova(12);
		//levi helikopter topovi
		this.dodajTop(0, -3, 232, 0, 0, 0, 0, 0, 0);
		this.dodajTop(1, 94, 292, 0, 0, 0, 0, 0, 0);
		this.dodajTop(2, 191, 233, 0, 0, 0, 0, 0, 0);
		//desni helikopter topovi
		this.dodajTop(3, 297, 232, 0, 0, 0, 0, 0, 0);
		this.dodajTop(4, 394, 292, 0, 0, 0, 0, 0, 0);
		this.dodajTop(5, 491, 233, 0, 0, 0, 0, 0, 0);
		//srednji helikopter topovi
		this.dodajTop(6, 221, 294, 0, 0, 0, 0, 0, 0);
		this.dodajTop(7, 244, 300, 0, 0, 0, 0, 0, 0);
		this.dodajTop(8, 268, 294, 0, 0, 0, 0, 0, 0);
		//topovi u 8 smera
		this.dodajTop(9, 249, 166, 0, 0, 0, 0, 0, 0);
		this.dodajTop(10, 140, 142, 0, 0, 0, 0, 0, 0);
		this.dodajTop(11, 358, 142, 0, 0, 0, 0, 0, 0);
	}

	
	public boolean isBlink1() {
		return blink1;
	}

	public void setBlink1(boolean blink1) {
		this.blink1 = blink1;
	}

	public boolean isBlink2() {
		return blink2;
	}

	public void setBlink2(boolean blink2) {
		this.blink2 = blink2;
	}

	public boolean isBlink3() {
		return blink3;
	}

	public void setBlink3(boolean blink3) {
		this.blink3 = blink3;
	}
	
	public Image getHP_bar1() {
		return HP_bar1;
	}

	public void setHP_bar1(Image hPBar1) {
		HP_bar1 = hPBar1;
	}

	public Image getHP_bar2() {
		return HP_bar2;
	}

	public void setHP_bar2(Image hPBar2) {
		HP_bar2 = hPBar2;
	}

	public Image getHP_bar3() {
		return HP_bar3;
	}

	public void setHP_bar3(Image hPBar3) {
		HP_bar3 = hPBar3;
	}

	public int getHP2() {
		return HP2;
	}

	public void setHP2(int hP2) {
		HP2 = hP2;
	}

	public int getHP3() {
		return HP3;
	}

	public void setHP3(int hP3) {
		HP3 = hP3;
	}

	public int getMetakSredina() {
		return metakSredina;
	}

	public void setMetakSredina(int metakSredina) {
		this.metakSredina = metakSredina;
	}

	public Animation getBlink() {
		return blink;
	}

	public void setBlink(Animation blink) {
		this.blink = blink;
	}
	
	public int getBrBlink1() {
		return brBlink1;
	}

	public void setBrBlink1(int brBlink1) {
		this.brBlink1 = brBlink1;
	}


	public int getBrBlink2() {
		return brBlink2;
	}

	public void setBrBlink2(int brBlink2) {
		this.brBlink2 = brBlink2;
	}
	
	public int getBrBlink3() {
		return brBlink3;
	}

	public void setBrBlink3(int brBlink3) {
		this.brBlink3 = brBlink3;
	}
	
	public int getMetakOdbrojavanje2() {
		return metakOdbrojavanje2;
	}

	public void setMetakOdbrojavanje2(int metakOdbrojavanje2) {
		this.metakOdbrojavanje2 = metakOdbrojavanje2;
	}

	public boolean isPucaNaPrvog() {
		return pucaNaPrvog;
	}

	public void setPucaNaPrvog(boolean pucaNaPrvog) {
		this.pucaNaPrvog = pucaNaPrvog;
	}
	
	//TREPTANJE
	
	public ArrayList<Metak> getRakete() {
		return rakete;
	}


	public void setRakete(ArrayList<Metak> rakete) {
		this.rakete = rakete;
	}


	//pocetak treptanja
	public void startBlink(int brojElise) {
		if(brojElise == 1) {
			blink1 = true;
		}
		else if(brojElise == 2) {
			blink2 = true;
		}
		else {
			blink3 = true;
		}
		blink.restart();
	}
	
	//prestanak treptanja
	public void stopBlink(int brojElise) {
		if(brojElise == 1) {
			brBlink1 = 5;
			blink1 = false;
			this.setBlk(false);
		}
		else if(brojElise == 2) {
			brBlink2 = 5;
			blink2 = false;
			this.setBlk(false);
		}
		else {
			brBlink3 = 5;
			blink3 = false;
			this.setBlk(false);
		}
	}
	
	//koliko dugo da trepce
	public void blink() {
		if(blink1) {
			brBlink1--;
			if(brBlink1 == 0) {
				stopBlink(1);	
			}
		}
		else if(blink2) {
			brBlink2--;
			if(brBlink2 == 0) stopBlink(2);
		}
		else {
			brBlink3--;
			if(brBlink3 == 0) stopBlink(3);
		}
	}


//KRETANJE
	
	public void move(int delta, Kolizija kolizija){
		kreciSe(delta, kolizija);
		if(!this.getNivo().mozeFull(kolizija.getObjekatVoda(), this.getProtivnikX(), this.getProtivnikY(), this.getSizeX(), this.getSizeY()) 
				|| !this.getNivo().mozeJa(this)
				|| !this.getNivo().mozeJaDva(this)) 
			promeniSmer(delta, kolizija);
		else promenaSmeraKrajNivoa(delta, kolizija);	
	}
	
//PUCANJE
	
	//prepravljena metoda klase Protivnik
	public void pucaj(float x, float y, int smerM, boolean belo) throws SlickException {
		Metak m=new Metak();
		m.setMetak(new Image ("res/raketa_dole.png"));
		m.setRaketa(true);
		m.setMetakX(x);
		m.setMetakY(y);	
		m.setSmer(smerM);
		rakete.add(m);
		//pucanj.play();
	}
	
	//prepravljena metoda klase Protivnik
	public void pucanje(int index, int brTopova, boolean belo, int smer) throws SlickException {
		for(int i=0;i<brTopova;i++) {
			int j = index + i;
			//puca samo na dole
			pucaj(this.getProtivnikX() + this.getKordTop(j).getSmer0X(), this.getProtivnikY() + this.getKordTop(j).getSmer0Y(), smer, belo);
		}
	}
	
	//prepravljena metoda klase Protivnik
	public void firing(int smer, int index, int brTopova, boolean belo) throws SlickException {
		this.incMetakO();
		if(this.getMetakOdbrojavanje() == 0) {
			//setSmer(smer);
			if(!this.isBlk()) promeniAnimaciju();
			pucanje(index, brTopova, belo, smer);
			setMetakOdbrojavanje(20);
		}
	}
	
	//prepravljena metoda klase Protivnik
	public void firing2(int smer, int index, int brTopova, boolean belo) throws SlickException {
		metakOdbrojavanje2--;
		if(metakOdbrojavanje2 == 0) {
			//if(!pucaNaPrvog) setSmer(smer);
			if(!isBlk()) promeniAnimaciju();
			pucanje(index, brTopova, belo, smer);
			metakOdbrojavanje2 = 20;
		}
	}
	
	//pucanje po jednom smeru
	public void fire(boolean belo) throws SlickException {
		//levi helikopter
		//levi top
		if(this.getIgrac().isZiv()
				&& this.getProtivnikX() - getProtivnikPomerajX() <= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 5 + getProtivnikPomerajX() >= this.getIgrac().getTenkX() + this.getTenkPomeraj()) { 
				//&& this.getProtivnikY() + 100 <= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
			firing(0, 0, 1, belo);
			pucaNaPrvog = true;
		}
		//srednji top
		else if(getHP2() > 0 && this.getIgrac().isZiv()
				&& this.getProtivnikX() + 97 - getProtivnikPomerajX() <= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 102 + getProtivnikPomerajX() >= this.getIgrac().getTenkX() + this.getTenkPomeraj()) { 
				//&& this.getProtivnikY() + 100 <= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
			firing(0, 1, 1, belo);
			pucaNaPrvog = true;
		}
		//desni top
		else if(this.getIgrac().isZiv()
				&& this.getProtivnikX() + 194 - getProtivnikPomerajX() <= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 199 + getProtivnikPomerajX() >= this.getIgrac().getTenkX() + this.getTenkPomeraj()) { 
				//&& this.getProtivnikY() + 100 >= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
			firing(0, 2, 1, belo);
			pucaNaPrvog = true;
		}
		//desni helikopter
		//levi top
		else if(this.getIgrac().isZiv()
				&& this.getProtivnikX() + 300 - getProtivnikPomerajX() <= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 305 + getProtivnikPomerajX() >= this.getIgrac().getTenkX() + this.getTenkPomeraj()) { 
				//&& this.getProtivnikY() + 100 <= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
			firing(0, 3, 1, belo);
			pucaNaPrvog = true;
		}
		//srednji top
		else if(getHP3() > 0 && this.getIgrac().isZiv()
				&& this.getProtivnikX() + 397 - getProtivnikPomerajX() <= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 402 + getProtivnikPomerajX() >= this.getIgrac().getTenkX() + this.getTenkPomeraj()) { 
				//&& this.getProtivnikY() + 100 <= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
			firing(0, 4, 1, belo);
			pucaNaPrvog = true;
		}
		//desni top
		else if(this.getIgrac().isZiv()
				&& this.getProtivnikX() + 494 - getProtivnikPomerajX() <= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 499 + getProtivnikPomerajX() >= this.getIgrac().getTenkX() + this.getTenkPomeraj()) { 
				//&& this.getProtivnikY() + 100 >= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
			firing(0, 5, 1, belo);
			pucaNaPrvog = true;
		}
		//srednji helikopter
		//sva tri
		else if(this.getIgrac().isZiv()
				&& this.getProtivnikX() + 224 - getProtivnikPomerajX() <= this.getIgrac().getTenkX() + this.getTenkPomeraj() 
				&& this.getProtivnikX() + 275 + getProtivnikPomerajX() >= this.getIgrac().getTenkX() + this.getTenkPomeraj()) {  
				//&& this.getProtivnikY() + 100 >= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
			firing(0, 6, 3, belo);
			pucaNaPrvog = true;
		}
		if(this.isImaDvaIgraca()) {
			//levi helikopter
			//levi top
			if(this.getIgrac2().isZiv()
					&& this.getProtivnikX() - getProtivnikPomerajX() <= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 5 + getProtivnikPomerajX() >= this.getIgrac2().getTenkX() + this.getTenkPomeraj()) { 
					//&& this.getProtivnikY() + 100 <= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
				firing2(0, 0, 1, belo);
			}
			//srednji top
			else if(this.getIgrac2().isZiv()
					&& this.getProtivnikX() + 97 - getProtivnikPomerajX() <= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 102 + getProtivnikPomerajX() >= this.getIgrac2().getTenkX() + this.getTenkPomeraj()) { 
					//&& this.getProtivnikY() + 100 <= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
				firing2(0, 1, 1, belo);
			}
			//desni top
			else if(this.getIgrac2().isZiv()
					&& this.getProtivnikX() + 194 - getProtivnikPomerajX() <= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 199 + getProtivnikPomerajX() >= this.getIgrac2().getTenkX() + this.getTenkPomeraj()) { 
					//&& this.getProtivnikY() + 100 >= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
				firing2(0, 2, 1, belo);
			}
			//desni helikopter
			//levi top
			else if(this.getIgrac2().isZiv()
					&& this.getProtivnikX() + 300 - getProtivnikPomerajX() <= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 305 + getProtivnikPomerajX() >= this.getIgrac2().getTenkX() + this.getTenkPomeraj()) { 
					//&& this.getProtivnikY() + 100 <= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
				firing2(0, 3, 1, belo);
			}
			//srednji top
			else if(this.getIgrac2().isZiv()
					&& this.getProtivnikX() + 397 - getProtivnikPomerajX() <= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 402 + getProtivnikPomerajX() >= this.getIgrac2().getTenkX() + this.getTenkPomeraj()) { 
					//&& this.getProtivnikY() + 100 <= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
				firing2(0, 4, 1, belo);
			}
			//desni top
			else if(this.getIgrac2().isZiv()
					&& this.getProtivnikX() + 494 - getProtivnikPomerajX() <= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 499 + getProtivnikPomerajX() >= this.getIgrac2().getTenkX() + this.getTenkPomeraj()) { 
					//&& this.getProtivnikY() + 100 >= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
				firing2(0, 5, 1, belo);
			}
			//srednji helikopter
			//sva tri
			else if(this.getIgrac2().isZiv()
					&& this.getProtivnikX() + 224 - getProtivnikPomerajX() <= this.getIgrac2().getTenkX() + this.getTenkPomeraj() 
					&& this.getProtivnikX() + 275 + getProtivnikPomerajX() >= this.getIgrac2().getTenkX() + this.getTenkPomeraj()) {  
					//&& this.getProtivnikY() + 100 >= this.getIgrac().getTenkY() + this.getTenkPomeraj()) {
				firing2(0, 6, 3, belo);
			}	
		}
	}
	
	//pucanje u 8 smera
	public void fire8(boolean belo) throws SlickException {
		metakSredina--;
		if(metakSredina == 0) {
			for(int i=9;i<getBrojTopova();i++) pucaj8(this.getProtivnikX() + this.getKordTop(i).getSmer0X(), this.getProtivnikY() + this.getKordTop(i).getSmer0Y(), belo);
			metakSredina=100;
		}
	}
	
//BOSS AI
	
	public void protivnikAI(int delta, Kolizija kolizija, boolean belo) throws SlickException  {
		if(!this.getNivo().isPocniNivo() && this.isUbiven() == false) {
			blink();
			algoritamKretanja(delta, kolizija);
			move(delta, kolizija);
			fire8(belo);
			fire(belo);
		}
	}
	
	//CRTANJE
	
	//postavljanje animacije
	public void setAnimation() throws SlickException {
		Image [] boss = {new Image("res/sky_destroyer.png"), new Image("res/sky_destroyer2.png")};
		Image [] elisa = {new Image("res/elisa1.png"), new Image("res/elisa2.png")};
		Image [] blink = {new Image("res/elisa_blink.png"), new Image("res/elisa_blink2.png")};
		Image [] rupa = {new Image("res/rupa_heli.png"), new Image("res/rupa_heli_2.png"),
						new Image("res/rupa_heli_3.png"), new Image("res/rupa_heli_2.png")};
		this.setMovingUp(new Animation(boss, this.getDuration(), true));//true se stavlja zbog autoupdate
		this.setMovingDown(new Animation(boss, this.getDuration(), true));
		this.setMovingLeft(new Animation(boss, this.getDuration(), true));
		this.setMovingRight(new Animation(boss, this.getDuration(), true));
		this.setBlink(new Animation(blink, this.getDuration(), true));
		this.setElisa(new Animation(elisa, this.getDuration(), true));
		this.setRupa(new Animation(rupa, this.getDuration()[0]*3, true));
		this.setProtivnik(this.getMovingDown());
	}
	
	public Animation getElisa() {
		return elisa;
	}

	public void setElisa(Animation elisa) {
		this.elisa = elisa;
	}
	
	public Animation getEksplozija2() {
		return eksplozija2;
	}


	public void setEksplozija2(Animation eksplozija2) {
		this.eksplozija2 = eksplozija2;
	}


	public Animation getEksplozija3() {
		return eksplozija3;
	}


	public void setEksplozija3(Animation eksplozija3) {
		this.eksplozija3 = eksplozija3;
	}

	public Animation getRupa() {
		return rupa;
	}


	public void setRupa(Animation rupa) {
		this.rupa = rupa;
	}


	public void eksplodiraj () {
		getEksplozija().draw(getProtivnikX()+226, getProtivnikY()+48);
		getEksplozija().draw(getProtivnikX()+76, getProtivnikY()+200);
		getEksplozija().draw(getProtivnikX()+376, getProtivnikY()+200);
		getEksplozija().draw(getProtivnikX()+178, getProtivnikY()+122);
		getEksplozija().draw(getProtivnikX()+281, getProtivnikY()+122);
		getEksplozija().draw(getProtivnikX()+231, getProtivnikY()+198);
		getEksplozija().setLooping(false);
	}

	public void eksplodiraj2 () {
		eksplozija2.draw(getProtivnikX()+76, getProtivnikY()+200);
		eksplozija2.setLooping(false);
	}
	
	public void eksplodiraj3 () {
		eksplozija3.draw(getProtivnikX()+376, getProtivnikY()+200);
		eksplozija3.setLooping(false);
	}

	//iscrtavanje boss-a i helth bara
	public void crtaj(Graphics g) throws SlickException {
		super.crtaj(g);
		if (getHP() > 0) {
			if (blink1) {
				blink.draw(getProtivnikX()+226, getProtivnikY()+48);
			}
			elisa.draw(getProtivnikX()+176, getProtivnikY());
		}
		if (getHP2() > 0) {
			if (blink2) {
				blink.draw(getProtivnikX()+76, getProtivnikY()+200);
			}
			elisa.draw(getProtivnikX()+26, getProtivnikY()+152);
		}
		else {
			rupa.draw(getProtivnikX()+76, getProtivnikY()+200);
		}
		if (getHP3() > 0) {
			if (blink3) {
				blink.draw(getProtivnikX()+376, getProtivnikY()+200);
			}
			elisa.draw(getProtivnikX()+326, getProtivnikY()+152);
		}
		else {
			rupa.draw(getProtivnikX()+376, getProtivnikY()+200);
		}
		
		Color stara = g.getColor();
		if (getHP2() > 0 || getHP3() > 0) {
			if (getHP2() > 0) {
				g.setColor(Igrac.DARK_RED);
				g.fillRect(getProtivnikX(), getProtivnikY()+85, 200, 10);
				g.setColor(Igrac.LIME);
				g.fillRect(getProtivnikX(), getProtivnikY()+85, 200*getHP2()/startHP2, 10);
				g.setColor(Color.black);
				g.drawRect(getProtivnikX(), getProtivnikY()+85, 200, 10);
			}
			if (getHP3() > 0) {
				g.setColor(Igrac.DARK_RED);
				g.fillRect(getProtivnikX()+300, getProtivnikY()+85, 200, 10);
				g.setColor(Igrac.LIME);
				g.fillRect(getProtivnikX()+300, getProtivnikY()+85, 200*getHP3()/startHP3, 10);
				g.setColor(Color.black);
				g.drawRect(getProtivnikX()+300, getProtivnikY()+85, 200, 10);
			}
		}
		else {
			g.setColor(Igrac.DARK_RED);
			g.fillRect(getProtivnikX()+100, getProtivnikY()-20, 300, 10);
			g.setColor(Igrac.LIME);
			g.fillRect(getProtivnikX()+100, getProtivnikY()-20, 300*getHP()/startHP, 10);
			g.setColor(Color.black);
			g.drawRect(getProtivnikX()+100, getProtivnikY()-20, 300, 10);
		}
		g.setColor(stara);
	}
	
	public void ozivi() {
		super.ozivi();
		rakete.clear();
		this.setHP(startHP);
		HP2 = startHP2;
		HP3 = startHP3;
		eksplozija2.setLooping(true);
		eksplozija2.restart();
		eksplozija3.setLooping(true);
		eksplozija3.restart();
		metakSredina = 1;
		brBlink1 = 5;
		brBlink2 = 5;
		brBlink3 = 5;
	}

}
